package de.akabahn.ebd.stw.zdxfc.prs;

import static de.akabahn.ebd.stw.zdxfc.prs.ZDXFCConstants.AUFLOESUNG_OK;
import static de.akabahn.ebd.stw.zdxfc.prs.ZDXFCConstants.FAHRSTRASSE_OK;

import org.apache.log4j.Logger;

import de.akabahn.ebd.stw.zdxfc.prs.fst.FahrStrasse;

/**
 * Hintergrundtask, der in regelmaessigen Abstaenden laeuft um zeitabhaengige Bedingungen zu pruefen.<br>
 * Die regelmaessige Ausfuehrung wird durch den <code>ScheduledExecutorService</code> verwaltet.
 * 
 * @author Peter Eimann
 * @since 1.0
 * @version 1.2
 */
public class ZDXFCBackgroundTask implements Runnable {

	private final static Logger LOG = Logger.getLogger(ZDXFCBackgroundTask.class);
	
	private ZDXFCMain main;

	/**
	 * Initialisierung der Klasse
	 * 
	 * @param main Referenz auf die Hauptklasse
	 */
	public ZDXFCBackgroundTask(ZDXFCMain main) {
		this.main = main;
	}

	/**
	 * Beim Aufruf dieser Methode werden folgende Pruefungen durchgefuehrt:<br>
	 * <ol>
	 * <li>Aufloesezeit einer Fahrstrasse ist abgelaufen: Verschluss der Fahrstrasse aufloesen
	 * und die Aufloesezeit auf <code>AUFLOESUNG_OK</code> setzen</li>
	 * <li>Ist eine Fahrstrasse gespeichert, pruefen, ob sie jetzt eingestellt werden kann</li>
	 * <li>Testzeit des Blocks zwischen Chateauprix und Martinstein ist abgelaufen: Testzeit auf 0
	 * zuruecksetzen</li>
	 * </ol>
	 * Exceptions, die waehrend des Ablaufs der Methode auftreten, werden im Logfile protokolliert.
	 */
	@Override
	public void run() {
		FahrStrasse fahrStrasse = null;
		
		try {
			if (!main.isRestart()) {
				for (String id : main.getFahrStrassen().keySet()) {
					fahrStrasse = main.getFahrStrasse(id);
					
					if (fahrStrasse.getAufloeseZeit() > 0) {
						if (System.currentTimeMillis() >= fahrStrasse.getAufloeseZeit()) {
							LOG.debug("Fahrstrasse " + id + " kann aufgeloest werden");
							fahrStrasse.setVerschlossen(false);
							fahrStrasse.setAufloeseZeit(AUFLOESUNG_OK);
						}
					}
					
					if (fahrStrasse.isGespeichert() && (!fahrStrasse.isEinstellenVorbereiten())) {
						if (fahrStrasse.pruefen() == FAHRSTRASSE_OK) {
							LOG.debug("Fahrstrasse " + id + " kann eingestellt werden");
							fahrStrasse.einstellen();
						}
					}
				}
	
				if (main.getBlock1231().getTestZeit() > 0) {
					if (System.currentTimeMillis() >= main.getBlock1231().getTestZeit()) {
						LOG.debug("Testzeit fuer Block " + main.getBlock1231().getId() + " abgelaufen");
						main.getBlock1231().setTestZeit(0);
					}
				}

				if (main.getFahrStrassenTasteSperrzeit() > 0) {
					if (System.currentTimeMillis() > main.getFahrStrassenTasteSperrzeit()) {
						main.setFahrStrassenTasteSperrzeit(-1);
						LOG.debug("Fahrstrassen-Taste Sperrzeit aufgehoben");
					}
				}
			}
		} catch (Exception e) {
			LOG.error("Exception caught in background task", e);
		}
	}
}
